/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.comeval.vista;

import java.security.Key;

import com.comeval.logica.LogicaPersonaLocal;
import com.comeval.logica.LogicaRolLocal;
import com.comeval.modelo.Persona;
import com.comeval.modelo.Rol;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.password.Password;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItemGroup;

/**
 *
 * @author LUISA
 */
@ManagedBean(name = "personaVista")
@RequestScoped
public class PersonaVista {

    @EJB
    private LogicaPersonaLocal personaLogica;

    @EJB
    private LogicaRolLocal rolLogica;

    private InputText txtDocumentoPersona;
    private InputText txtNombrePersona;
    private InputText txtApellidoPersona;
    private InputText txtDireccionPersona;
    private InputText txtTelefonoPersona;
    private InputText txtCorreoPersona;
    private SelectOneMenu cmbMunicipio;
    private SelectOneMenu cmbRolPersona;
    private Password txtContraseñaPersona;

    private CommandButton btnRegistrar;
    private CommandButton btnModificar;
    private CommandButton btnEliminar;
    private CommandButton btnLimpiar;

    private List<Persona> listaPersona;
    private Persona selectedPersona;
    private ArrayList<SelectItem> itemsRoles = null;
    private List<SelectItem> municipios = null;

    /**
     * Creates a new instance of PersonaVista
     */
    public PersonaVista() {
    }

    public LogicaPersonaLocal getPersonaLogica() {
        return personaLogica;
    }

    public void setPersonaLogica(LogicaPersonaLocal personaLogica) {
        this.personaLogica = personaLogica;
    }

    public InputText getTxtDocumentoPersona() {
        return txtDocumentoPersona;
    }

    public void setTxtDocumentoPersona(InputText txtDocumentoPersona) {
        this.txtDocumentoPersona = txtDocumentoPersona;
    }

    public InputText getTxtNombrePersona() {
        return txtNombrePersona;
    }

    public void setTxtNombrePersona(InputText txtNombrePersona) {
        this.txtNombrePersona = txtNombrePersona;
    }

    public InputText getTxtApellidoPersona() {
        return txtApellidoPersona;
    }

    public void setTxtApellidoPersona(InputText txtApellidoPersona) {
        this.txtApellidoPersona = txtApellidoPersona;
    }

    public InputText getTxtDireccionPersona() {
        return txtDireccionPersona;
    }

    public void setTxtDireccionPersona(InputText txtDireccionPersona) {
        this.txtDireccionPersona = txtDireccionPersona;
    }

    public InputText getTxtTelefonoPersona() {
        return txtTelefonoPersona;
    }

    public void setTxtTelefonoPersona(InputText txtTelefonoPersona) {
        this.txtTelefonoPersona = txtTelefonoPersona;
    }

    public InputText getTxtCorreoPersona() {
        return txtCorreoPersona;
    }

    public void setTxtCorreoPersona(InputText txtCorreoPersona) {
        this.txtCorreoPersona = txtCorreoPersona;
    }

    public SelectOneMenu getCmbMunicipio() {
        return cmbMunicipio;
    }

    public void setCmbMunicipio(SelectOneMenu cmbMunicipio) {
        this.cmbMunicipio = cmbMunicipio;
    }

    public SelectOneMenu getCmbRolPersona() {
        return cmbRolPersona;
    }

    public void setCmbRolPersona(SelectOneMenu cmbRolPersona) {
        this.cmbRolPersona = cmbRolPersona;
    }

    public Password getTxtContraseñaPersona() {
        return txtContraseñaPersona;
    }

    public void setTxtContraseñaPersona(Password txtContraseñaPersona) {
        this.txtContraseñaPersona = txtContraseñaPersona;
    }

    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    public CommandButton getBtnModificar() {
        return btnModificar;
    }

    public void setBtnModificar(CommandButton btnModificar) {
        this.btnModificar = btnModificar;
    }

    public CommandButton getBtnEliminar() {
        return btnEliminar;
    }

    public void setBtnEliminar(CommandButton btnEliminar) {
        this.btnEliminar = btnEliminar;
    }

    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    public List<Persona> getListaPersona() {
        if (listaPersona == null) {
            try {
                listaPersona = personaLogica.consultarPersonas();
            } catch (Exception ex) {
                Logger.getLogger(PersonaVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return listaPersona;
    }

    public void setListaPersona(List<Persona> listaPersona) {
        this.listaPersona = listaPersona;
    }

    public Persona getSelectedPersona() {
        return selectedPersona;
    }

    public void setSelectedPersona(Persona selectedPersona) {
        this.selectedPersona = selectedPersona;
    }

    public List<SelectItem> getMunicipios() {
        SelectItemGroup g1 = new SelectItemGroup("Valle");
        g1.setSelectItems(new SelectItem[]{new SelectItem("Tuluá", "Tuluá"), new SelectItem("Roldanillo", "Roldanillo")});

        SelectItemGroup g2 = new SelectItemGroup("Risaralda");
        g2.setSelectItems(new SelectItem[]{new SelectItem("Pereira", "Pereira")});

        SelectItemGroup g3 = new SelectItemGroup("Quindío");
        g3.setSelectItems(new SelectItem[]{new SelectItem("Armenia", "Armenia")});

        municipios = new ArrayList<SelectItem>();
        municipios.add(g1);
        municipios.add(g2);
        municipios.add(g3);

        return municipios;
    }

    public void setMunicipios(List<SelectItem> municipios) {
        this.municipios = municipios;
    }

    public LogicaRolLocal getRolLogica() {
        return rolLogica;
    }

    public void setRolLogica(LogicaRolLocal rolLogica) {
        this.rolLogica = rolLogica;
    }

    public ArrayList<SelectItem> getItemsRoles() {
        if (itemsRoles == null) {
            try {
                itemsRoles = new ArrayList<>();
                List<Rol> lista = rolLogica.consultar();
                for (int i = 0; i < lista.size(); i++) {
                    itemsRoles.add(new SelectItem(lista.get(i).getCodigorol(), lista.get(i).getNombrerol()));
                }
            } catch (Exception ex) {
                Logger.getLogger(PersonaVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return itemsRoles;
    }

    public void setItemsRoles(ArrayList<SelectItem> itemsRoles) {
        this.itemsRoles = itemsRoles;
    }

    public void funcion_limpiar() {
        txtDocumentoPersona.setValue("");
        txtNombrePersona.setValue("");
        txtApellidoPersona.setValue("");
        txtDireccionPersona.setValue("");
        txtTelefonoPersona.setValue("");
        txtCorreoPersona.setValue("");
        cmbMunicipio.setValue("");
        cmbRolPersona.setValue("");
        txtContraseñaPersona.setValue("");

        btnRegistrar.setDisabled(false);
        btnModificar.setDisabled(true);
        btnEliminar.setDisabled(true);
    }

    public void funcion_Registrar() {
        try {
            Persona p = new Persona();
            p.setDocumentonitpersona(txtDocumentoPersona.getValue().toString());
            p.setNombrepersona(txtNombrePersona.getValue().toString());
            p.setApellidopersona(txtApellidoPersona.getValue().toString());
            p.setDireccionpersona(txtDireccionPersona.getValue().toString());
            p.setTelefonopersona(Integer.parseInt(txtTelefonoPersona.getValue().toString()));
            p.setCorreopersona(txtCorreoPersona.getValue().toString());
            p.setMunicipiopersona(cmbMunicipio.getValue().toString());
            Rol rol = rolLogica.consultarPorRol(Integer.parseInt(cmbRolPersona.getValue().toString()));
            p.setCodigorol(rol);

            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(128);
            Key key = keyGenerator.generateKey();

            key = new SecretKeySpec("01234567890123456".getBytes(), 0, 16, "AES");

            Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");

            String contraseña = txtContraseñaPersona.getValue().toString();

            aes.init(Cipher.ENCRYPT_MODE, key);
            byte[] encriptado = aes.doFinal(contraseña.getBytes());

            String nEncriptado = encriptado.toString();
            p.setClavepersona(nEncriptado);

            personaLogica.registrarPersona(p);
            FacesContext.getCurrentInstance().addMessage("mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Información", "Se registró con éxito"));
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage("mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", ex.getMessage()));
            Logger.getLogger(PersonaVista.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void funcion_modificar() {
        try {
            Persona p = new Persona();
            p.setDocumentonitpersona(txtDocumentoPersona.getValue().toString());
            p.setNombrepersona(txtNombrePersona.getValue().toString());
            p.setApellidopersona(txtApellidoPersona.getValue().toString());
            p.setDireccionpersona(txtDireccionPersona.getValue().toString());
            p.setTelefonopersona(Integer.parseInt(txtTelefonoPersona.getValue().toString()));
            p.setCorreopersona(txtCorreoPersona.getValue().toString());
            p.setMunicipiopersona(cmbMunicipio.getValue().toString());
            Rol rol = rolLogica.consultarPorRol(Integer.parseInt(cmbRolPersona.getValue().toString()));
            p.setCodigorol(rol);
            personaLogica.modificarPersona(p);
            FacesContext.getCurrentInstance().addMessage("mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Información", "Se modificó con éxito"));
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage("mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", ex.getMessage()));
            Logger.getLogger(PersonaVista.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void funcion_eliminar(){
        Persona p=new Persona();
        p.setDocumentonitpersona(null);
    }

}
